package main

import "fmt"

// 函数声明语法
// func 函数名(参数列表) 返回值类型 { 函数体 }
func add(a int, b int) int {
	return a + b
}

// 函数声明语法，返回值类型省略
// func 函数名(参数列表) { 函数体 }
func sub(a int, b int) {
	fmt.Println(a - b)
}

// 函数声明语法，返回多个值
// func 函数名(参数列表) (返回值1类型, 返回值2类型,...) { 函数体 }
func swap(a, b int) (int, int) {
	return b, a
}

// 函数方法语法
// 结构体类型.函数名(参数列表)
type Person struct {
	name string
	age  int
}

func (p Person) sayHello() {
	fmt.Println("Hello, my name is", p.name, "and I am", p.age, "years old.")
}

// 闭包函数语法
// func 函数名(参数列表) (返回值类型) { 函数体 }
func closure(a int) func() int {
	b := a
	return func() int {
		b += 1
		return b
	}
}

// 函数调用语法
// 函数名(参数列表)
func main() {
	// 调用函数
	result := add(10, 20)
	fmt.Println("10 + 20 =", result)

	// 调用函数，省略返回值
	sub(10, 5)

	// 调用函数，返回多个值
	x, y := swap(10, 20)
	fmt.Println("x =", x, "y =", y)

	p := Person{"Alice", 25}
	p.sayHello()

	// 闭包函数
	f := closure(10)
	fmt.Println(f())
	fmt.Println(f())
}